// HTMLParser Library - A java-based parser for HTML
// http://htmlparser.org
// Copyright (C) 2006 Derrick Oswald
//
// Revision Control Information
//
// $URL: https://svn.sourceforge.net/svnroot/htmlparser/trunk/filterbuilder/src/main/java/org/htmlparser/parserapplications/filterbuilder/layouts/NullLayoutManager.java $
// $Author: derrickoswald $
// $Date: 2006-09-16 10:44:17 -0400 (Sat, 16 Sep 2006) $
// $Revision: 4 $
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the Common Public License; either
// version 1.0 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// Common Public License for more details.
//
// You should have received a copy of the Common Public License
// along with this library; if not, the license is available from
// the Open Source Initiative (OSI) website:
//   http://opensource.org/licenses/cpl1.0.php

package org.htmlparser.parserapplications.filterbuilder.layouts;

import java.awt.*;
import java.io.*;

/**
 * A layout manager that doesn't move things around. Attempts to set the bounds
 * of components to accomodate them but doesn't move them.
 */
public class NullLayoutManager implements LayoutManager2, Serializable {
	/**
	 * Constructs a NullLayoutManager object.
	 */
	public NullLayoutManager() {
	}

	/**
	 * Calculates the minimum size dimensions for the specified panel given the
	 * components in the specified parent container.
	 * 
	 * @param target
	 *            The component to be laid out.
	 * @return The minimum size.
	 * @see #preferredLayoutSize
	 */
	public Dimension minimumLayoutSize(Container target) {
		return (preferredLayoutSize(target));
	}

	/**
	 * Calculates the preferred size dimensions for the specified panel given
	 * the components in the specified parent container.
	 * 
	 * @see #minimumLayoutSize
	 * @param target
	 *            The component to be laid out.
	 * @return A size deemed suitable for laying out the container.
	 */
	public Dimension preferredLayoutSize(Container target) {
		int count;
		Container parent;
		Component component;
		Point point;
		Dimension dimension;
		Insets insets;
		Dimension ret;

		synchronized (target.getTreeLock()) {
			count = target.getComponentCount();
			if (0 == count) {
				// be the same size unless we have a parent
				ret = target.getSize();
				parent = target.getParent();
				if (null != parent) {
					insets = parent.getInsets();
					ret = parent.getSize();
					ret.setSize(ret.width - insets.left - insets.right, ret.height - insets.top - insets.bottom);
				}
			} else {
				ret = new Dimension(0, 0);
				for (int i = 0; i < count; i++) {
					component = target.getComponent(i);
					if (component.isVisible()) {
						point = component.getLocation();
						dimension = component.getPreferredSize();
						ret.width = Math.max(ret.width, point.x + dimension.width);
						ret.height = Math.max(ret.height, point.y + dimension.height);
					}
				}
				insets = target.getInsets();
				ret.width += insets.left + insets.right;
				ret.height += insets.top + insets.bottom;
			}
		}

		return (ret);
	}

	/**
	 * Returns the maximum size of this component.
	 * 
	 * @param target
	 *            The component to be laid out.
	 * @return The maximum size for the container.
	 * @see #preferredLayoutSize
	 */
	public Dimension maximumLayoutSize(Container target) {
		return (preferredLayoutSize(target));
	}

	//
	// LayoutManager Interface
	//

	/**
	 * Adds the specified component with the specified name to the layout.
	 * 
	 * @param name
	 *            the component name
	 * @param comp
	 *            the component to be added
	 */
	public void addLayoutComponent(String name, Component comp) {
	}

	/**
	 * Removes the specified component from the layout.
	 * 
	 * @param comp
	 *            the component ot be removed
	 */
	public void removeLayoutComponent(Component comp) {
	}

	/**
	 * Lays out the container.
	 * 
	 * @param target
	 *            The container which needs to be laid out.
	 */
	public void layoutContainer(Container target) {
		int count;
		Component component;
		Dimension dimension;

		synchronized (target.getTreeLock()) {
			count = target.getComponentCount();
			for (int i = 0; i < count; i++) {
				component = target.getComponent(i);
				if (component.isVisible()) {
					dimension = component.getPreferredSize();
					component.setSize(dimension.width, dimension.height);
				}
			}
		}
	}

	//
	// LayoutManager2 Interface
	//

	/**
	 * Adds the specified component to the layout, using the specified
	 * constraint object.
	 * 
	 * @param comp
	 *            the component to be added
	 * @param constraints
	 *            where/how the component is added to the layout.
	 */
	public void addLayoutComponent(Component comp, Object constraints) {
	}

	/**
	 * Returns the alignment along the x axis. This specifies how the component
	 * would like to be aligned relative to other components. The value should
	 * be a number between 0 and 1 where 0 represents alignment along the
	 * origin, 1 is aligned the furthest away from the origin, 0.5 is centered,
	 * etc.
	 * 
	 * @param target
	 *            The target container.
	 * @return The X-axis alignment.
	 */
	public float getLayoutAlignmentX(Container target) {
		return (0.0f);
	}

	/**
	 * Returns the alignment along the y axis. This specifies how the component
	 * would like to be aligned relative to other components. The value should
	 * be a number between 0 and 1 where 0 represents alignment along the
	 * origin, 1 is aligned the furthest away from the origin, 0.5 is centered,
	 * etc.
	 * 
	 * @param target
	 *            The target container.
	 * @return The Y-axis alignment.
	 */
	public float getLayoutAlignmentY(Container target) {
		return (0.0f);
	}

	/**
	 * Invalidates the layout, indicating that if the layout manager has cached
	 * information it should be discarded.
	 * 
	 * @param target
	 *            The target container.
	 */
	public void invalidateLayout(Container target) {
	}
}
